Ruby 日記 32日目: 定数の探索順位
#Ruby_日記 #2021-09-28
https://rex.libertyfish.co.jp/exam_histories/42141/user_answers/2b9b094c-45b5-4988-b01e-c52b72267071
次のコードを実行するとどうなりますか。
code:gold/ex32/main.rb
class Human
NAME = "Unknown"
def name
NAME
end
end
class Noguchi < Human
NAME = "Hideyo"
end
puts Noguchi.new.name
選択肢:
実行時にエラーとなる
何も表示されない
Unknown と表示される
Hideyo と表示される
解説:
過去の問題で関連しそうなのは
Ruby 日記 7日目: レキシカルスコープ
Ruby 日記 20日目: レキシカルスコープとクラスの継承
あたりかな?
ざっくり解説すると
NoguchiクラスはHumanクラスを継承している
のでNoguchiクラスのオブジェクトに対してnameメソッド呼ぶことができる
nameメソッド内のNAME変数はHumanクラス内に定義されているのでnameメソッドは"Unknown"を返す
2021-12-07追記
そうか、Humanクラス内のnameメソッドはHumanクラス内のNAME変数を参照するよね。
凡ミスっぽい。
code:sh
# ruby gold/ex32/main.rb
Unknown
/icons/hr.icon
例えばもしもHumanクラスにNAMEが定義されていなかったら?
code:gold/ex32/sample01.rb
class Human
def name
NAME
end
end
class Noguchi < Human
NAME = "Hideyo"
end
puts Noguchi.new.name
code:sh
# ruby gold/ex32/sample01.rb
gold/ex32/sample01.rb:3:in `name': uninitialized constant Human::NAME (NameError)
from gold/ex32/sample01.rb:11:in `<main>'
エラーになるね
/icons/hr.icon
nameメソッドがNoguchiクラスに定義されていたら?
code:gold/ex32/sample02.rb
class Human
NAME = "Unknown"
end
class Noguchi < Human
NAME = "Hideyo"
def name
NAME
end
end
puts Noguchi.new.name
code:sh
# ruby gold/ex32/sample02.rb
Hideyo
Noguchiクラスに定義された"Hideyo"が表示されるね。
/icons/hr.icon
sample02でNoguchiクラスにNAMEが定義されていなかったら?
code:gold/ex32/sample03.rb
class Human
NAME = "Unknown"
end
class Noguchi < Human
def name
NAME
end
end
puts Noguchi.new.name
code:sh
# ruby gold/ex32/sample03.rb
Unknown
NoguchiクラスにNAMEが定義されていないので、継承したHumanクラスを探索し NAME = "Unknown" を発見する
ので、Unknownが表示されるね。